#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "apagar.h"

void apagar(char *argv[])
{
    FILE *f,*f2;

    int escrita;
    int lei;
    
    cria_semaforo(escrita,1); //semafero para escrita
    cria_semaforo(lei,20); //semafero para leitura


    if((f=fopen("fic.txt","r"))==NULL){ //verifica se o ficheiro abre
        printf("Ficheiro nao existe\n");
        exit(2);
    }
    
    if((f2=fopen("tab.txt","r"))==NULL){
        printf("Ficheiro nao existe\n");
        exit(2);
    }
    
    int nml=qualel(argv[1]); //verifica qual o numero de linha da tab de ref
    char Nome[20];
    int quant,i,e,v;
    long nlmed,nlmed2,linha;
    
    P(escrita); //reserva semafero de escrita
    for(i=0;i<20;i++) P(lei); //reserva semaferos de leitura
    
    for(i=0;i<=nml;i++) fscanf(f2,"%lu",&nlmed); //avança até a linha na tab
    fscanf(f2,"%lu",&nlmed2);
    linha=nlmed*28; //calcula o numero de bytes a saltar
    fseek(f,linha, SEEK_SET);
    
    fscanf(f,"%s%d%d",Nome,&quant,&v); //ler o valor da primeira linha
    e=eigual(Nome,argv[1]); //compara
    
    while(e==1&&nlmed<nlmed2){ //ciclo de pesquisa sequencial
        fscanf(f,"%s%d%d",Nome,&quant,&v);
        e=eigual(Nome,argv[1]);
        nlmed++;
    }

    fclose(f);
    fclose(f2);

    if(e==1||e==2) printf("Registo não existe\n");
    else(apaga(nlmed, nml));//se registo existe

    for(i=0;i<20;i++) V(lei); //terminado, liberta os semaferos
    V(escrita);
}

void apaga(int nml, int nml2){ //função de apagar
    char buf[300];
    char b[10]="fic.txt\0"; //diferentes ficheiros
    char b2[12]="temp1.txt\0";
    char b3[12]="temp2.txt\0";
    int a=nml+2; //linha a apagar
    
    if(nml!=0) sprintf(buf,"head -n %d /tmp/proj%s > /tmp/proj/%s", nml, b, b2);
    else sprintf(buf," > %s",b2);
    system(buf);
    sprintf(buf,"tail +%d /tmp/proj/%s > /tmp/proj/%s ",a, b, b3);
    system (buf);
    sprintf(buf,"cat /tmp/proj/%s >> /temp/proj/%s",b3,b2);
    system (buf);
    system ("rm /tmp/proj/temp2.txt");
    tabref(nml2);
    system ("mv temp1.txt fic.txt");
}

void tabref(int nml) //update da tabela de referencia
{
    FILE *f1, *f2;
    int apont=0;
    long ref;
    system(" >temp2.txt");
    f1=fopen("tab.txt","r");
    f2=fopen("temp2.txt","a+");
    
    while(fscanf(f1,"%lu",&ref)!=EOF){
        if(apont>nml) ref=ref-1;
        fprintf(f2,"%lu\n", ref);
        apont++;
    }

    system ("mv temp2.txt tab.txt");
}
		
